NAME
Class::Monadic - Provides monadic methods (a.k.a. singleton methods)
VERSION
This document describes Class::Monadic version 0.03.
SYNOPSIS
use Class::Monadic;
my $ua1 = LWP::UserAgent->new();
Class::Monadic->initialize($ua1)->add_method(
hello => sub{ print "Hello, world!\n" },
);
$ua1->hello(); # => Hello, world!
my $ua2 = LWP::UserAgent->new();
$ua2->foo(); # throws "Can't locate object method ..."
# because foo() is $ua1 specific.
# import a syntax sugar to make an object monadic
use Class::Monadic qw(monadic);
monadic($ua1)->inject_base(qw(SomeComponent OtherComponent));
# now $ua1 is-a both SomeComponent and OtherComponent
# per-object fields
monadic($ua1)->add_field(qw(x y z));
$ua1->set_x(42);
print $ua1->get_x(); # => 42
# per-object fields with validation
monadic($ua1)->add_field(
foo => qr/^\d+$/,
bar => [qw(apple banana)],
qux => \&is_something,
);
DESCRIPTION
Class::Monadic
provides per-object classes, monadic classes. It is also known as singleton classes in other languages, e.g. Ruby
.
Monadic classes is used in order to define monadic methods, i.e. per-object methods (a.k.a. singleton methods), which are only available at the specific object they are defined into.
All the meta data that Class::Monadic
deals with are outside the object associated with monadic classes, so this module does not depend on the implementation of the object.
INTERFACE
Exportable functions
monadic($object)
Specializes $object to have a monadic class, and returns Class::Monadic
instance, $meta.
This is a syntax sugar to Class::Monadic->initialize($object)
.
Class methods
Class::Monadic->initialize($object)
Specializes $object to have a monadic class, and returns Class::Monadic
instance, $meta.
Instance methods
$meta->name
Returns the name of the monadic class.
$meta->id
Returns the ID of the monadic class.
Its real class name is $meta->name . '::' . $meta->id
;
$meta->add_method(%name_code_pairs)
Adds methods into the monadic class.
$meta->add_field(@field_names)
Adds fields and accessors named get_$name/set_$name into the monadic class.
These fields are not stored in the object. Rather, stored in its class.
This feature is like what Object::Accessor
provides, but Class::Monadic
is available for all the classes existing, whareas Object::Accessor
is only available in classes that is-a Object::Accessor
.
$meta->add_modifier($type, @method_names, $code)
Adds method modifiers to specific methods, using Class::Method::Modifiers::Fast
.
$type is must be before
, around
or after
.
Example:
monadic($obj)->add_modifier(before => foo => sub{ ... });
monadic($obj)->add_modifier(around => qw(foo bar baz),
sub{
my $next = shift;
my(@args) = @_;
# ...
return &{$next};
}
);
monadic($obj)->add_modifier(after => xyzzy => sub{ ... });
See also Class::Method::Modifiers::Fast.
$meta->inject_base(@component_classes)
Adds @component_classes into the is-a hierarchy of the monadic class.
$meta->bless($another_object)
Copies all the features of $meta into $another_object.
CAVEATS
You cannot serialize objects with monadic classes, because its monadic features usually includes code references.
Patches are welcome.
DEPENDENCIES
Perl 5.8.1 or later.
Data::Util
.
Hash::FieldHash
.
BUGS
No bugs have been reported.
Please report any bugs or feature requests to the author.
SEE ALSO
AUTHOR
Goro Fuji (gfx) <gfuji(at)cpan.org>.
LICENSE AND COPYRIGHT
Copyright (c) 2009, Goro Fuji (gfx). Some rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.