NAME
Dispatch::Profile - Dispatch::Profile code dispatch framework
VERSION
version 0.001
SYNOPSIS
use
Dispatch::Profile;
sub
print_received {
"print_received: @_\n"
;
}
my
$target
= Dispatch::Profile->new(
profile
=> {
target
=>
'print_received'
,
},
);
$target
->dispatch(
'hello'
,
'world'
);
DESCRIPTION
Dispatch::Profile provides a means of simplyifying message flow between entities within an application. The Dispatch::Profile object utilises a simple profile format that allows dispatch to a variety of targets including methods within the main namespace, class methods both exported and non exported and object instantiated methods.
The class can also be used to extend an existing class through the inheritance of the dispatch and the Moose BUILD methods, allowing where required the message flow to be chained across multiple targets.
RATIONALE
I created this package to provide a simple means of dispatching data to different targets within an application with a minimum of changes to the underline code. When used with a standardised payload, it makes it very easy to switch or dispatch to multiple targets.
EXAMPLES
Example 1
Overview
The following depicts the creation of a caretaker object with a target method of print_received. All data sent through the object via the dispatch mechanism will be processed accordingly by the target method handler.
Code
use
Dispatch::Profile;
sub
print_received {
"print_received: @_\n"
;
}
my
$target
= Dispatch::Profile->new(
profile
=> {
target
=>
'print_received'
,
},
);
$target
->dispatch(
'hello'
,
'world'
);
Output
print_received: hello world
Example 2
Overview
The Dispatch::Profile object can facilitate multiple targets by specifying the profile configuration as an array of hashes. When the dispatch method is called, all targets are processed sequentially with the same payload.
Code
use
Dispatch::Profile;
sub
print_received {
"print_received: @_\n"
;
}
sub
print_received_uc {
my
@uc
=
map
(
uc
,
@_
);
"print_received_uc: @uc\n"
;
}
my
$target
= Dispatch::Profile->new(
profile
=> [
{
target
=>
'print_received'
,
},
{
target
=>
'print_received_uc'
,
},
]
);
$target
->dispatch(
'hello'
,
'world'
);
Output
print_received: hello world
print_received_uc: HELLO WORLD
Example 3
Overview
Targets that are provided through a specific class can be specified with the class keyword.
Code
use
Dispatch::Profile;
package
class1;
sub
print_received {
"print_received: @_\n"
;
}
package
class2;
sub
print_received_uc {
my
@uc
=
map
(
uc
,
@_
);
"print_received_uc: @uc\n"
;
}
package
main;
my
$target
= Dispatch::Profile->new(
profile
=> [
{
class
=>
'class1'
,
target
=>
'print_received'
,
},
{
class
=>
'class2'
,
target
=>
'print_received_uc'
,
},
]
);
$target
->dispatch(
'hello'
,
'world'
);
Output
print_received: hello world
print_received_uc: HELLO WORLD
Example 4
Overview
Targets can be initialised as objects through the object hashref option. The initialisation process expects the class to provide a 'new' method for object creation. Key/Values within the hashref are passed through to the object during initialisation.
Code
use
Dispatch::Profile;
package
class1;
use
Data::Dumper;
sub
new {
my
$package
=
shift
;
my
%options
=
@_
;
"Object of $package initialising with the following parameters:\n"
,Dumper(\
%options
),
"\n"
;
bless
{
@_
};
}
sub
print_received {
my
$self
=
shift
;
"print_received: @_\n"
;
}
package
class2;
use
Data::Dumper;
sub
new {
my
$package
=
shift
;
my
%options
=
@_
;
"Object of $package initialising with the following parameters:\n"
,Dumper(\
%options
),
"\n"
;
bless
{
@_
};
}
sub
print_received_uc {
my
$self
=
shift
;
my
@uc
=
map
(
uc
,
@_
);
"print_received_uc: @uc\n"
;
}
package
main;
my
$target
= Dispatch::Profile->new(
profile
=> [
{
class
=>
'class1'
,
target
=>
'print_received'
,
object
=> {
param1
=>
'value1'
},
},
{
class
=>
'class2'
,
target
=>
'print_received_uc'
,
object
=> {
param2
=>
'value2'
},
},
]
);
$target
->dispatch(
'hello'
,
'world'
);
Output
Object of class1 initialising
with
the following parameters:
$VAR1
= {
'param1'
=>
'value1'
};
Object of class2 initialising
with
the following parameters:
$VAR1
= {
'param2'
=>
'value2'
};
print_received: hello world
print_received_uc: HELLO WORLD
Example 5
Overview
The target object can continue the dispatch chain as an invoker of the Dispatch::Profile class. This functionality is enabled through the keyword forwarder. The package utilises the Moose Object Constructor method BUILD for initialisation allowing the calling object to facilitate it's own constructor.
Code
use
Dispatch::Profile;
package
class1;
use
Moose;
sub
print_received {
my
$self
=
shift
;
"print_received: @_\n"
;
}
package
class2;
use
Moose;
sub
print_received_uc {
my
$self
=
shift
;
my
@uc
=
map
(
uc
,
@_
);
"print_received_uc: @uc\n"
;
# Dispatch data to the next target
$self
->dispatch(
@uc
);
}
package
class3;
use
Moose;
sub
print_received_reverse {
my
$self
=
shift
;
my
@reverse
=
reverse
@_
;
"print_received_reverse: @reverse\n"
;
}
package
main;
my
$forwarder_target
= Dispatch::Profile->new(
profile
=> {
class
=>
'class3'
,
target
=>
'print_received_reverse'
,
object
=> {
param3
=>
'value3'
},
},
);
my
$target
= Dispatch::Profile->new(
profile
=> [
{
class
=>
'class1'
,
target
=>
'print_received'
,
object
=> {},
},
{
class
=>
'class2'
,
target
=>
'print_received_uc'
,
object
=> {
forwarder
=>
$forwarder_target
},
},
]
);
$target
->dispatch(
'hello'
,
'world'
);
Output
print_received: hello world
print_received_uc: HELLO WORLD
print_received_reverse: WORLD HELLO
AUTHOR
James Spurin <james@spurin.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by James Spurin.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.