NAME

Class::Monadic - Provides monadic methods (a.k.a. singleton methods)

VERSION

This document describes Class::Monadic version 0.02.

SYNOPSIS

use Class::Monadic;

my $ua1 = LWP::UserAgent->new();

Class::Monadic->initialize($ua1)->add_method(
	foo => sub{ ... },
);

$dbh1->foo(...); # OK

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->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.

CAVEATS

Currently, you can neither serialize nor clone objects with monadic classes, because they have meta data outside themselves. In addition, the meta data 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

Object::Accessor.

Class::Component.

Class::MOP.

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.