NAME
Class::Monadic - Provides monadic methods (a.k.a. singleton methods)
VERSION
This document describes Class::Monadic version 0.04.
SYNOPSIS
use Class::Monadic;
my $ua1 = LWP::UserAgent->new();
Class::Monadic->initialize($ua1)->add_methods(
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_fields(qw(x y z));
$ua1->set_x(42);
print $ua1->get_x(); # => 42
# per-object fields with validation
monadic($ua1)->add_fields(
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 available only at the 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)
$meta->add_methods(%name_code_pairs)
Adds methods into the monadic class.
$meta->add_field(@field_names)
$meta->add_fields(@field_names)
Adds field accessors named get_$name/set_$name into the monadic class. Setters are chainable like $obj->set_foo(42)->set_bar(3.14)
.
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, whereas 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
Although you can clone objects with monadic class, you cannot serialize these objects because its monadic features usually includes code references.
Patches are welcome.
DEPENDENCIES
Perl 5.8.1 or later.
Data::Util
.
Hash::FieldHash
.
Class::Method::Modifiers::Fast
.
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.