The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
package MooseX::Role::DryRunnable::Attribute;
use Moose::Util;
use Attribute::Handlers;

our $VERSION = '0.001';

sub UNIVERSAL::dry_it :ATTR(CODE) { 
  my $package = shift;
  my $glob    = shift;
  my $method  = *{$glob}{NAME};
  
  Moose::Util::add_method_modifier($package => around => [ $method => sub { 
      my $code   = shift;
      my $target = shift;

      die "Should be MooseX::Role::DryRunnable::Base\n" 
        unless $target->DOES('MooseX::Role::DryRunnable::Base');

      $target->is_dry_run() 
        ? $target->on_dry_run($method,@_) 
        : $target->$code(@_)
      }
  ]);
}

1;

__END__

=head1 NAME

MooseX::Role::DryRunnable::Attribute - EXPERIMENTAL - attribute to add a Dry Run Capability in some methods

=head1 SYNOPSIS

  package Foo;
  use Data::Dumper;
  use Moose;
  use MooseX::Role::DryRunnable::Attribute;
  with 'MooseX::Role::DryRunnable::Base';

  has dry_run => (is => 'ro', isa => 'Bool', default => 0);

  sub bar :dry_it {
    shift;
    print "Foo::bar @_\n";
  }

  sub is_dry_run { # required !
    shift->dry_run
  }

  sub on_dry_run { # required !
    my $self   = shift;
    my $method = shift;
    $self->logger("Dry Run method=$method, args: \n", @_);
  }

=head1 DESCRIPTION

This module can be used in Moose classes who uses the role MooseX::Role::DryRunnable::Base. Provides an Attribute :dry_it. EXPERIMETAL

My idea is put the information about the dry run capability close to the method.

=head1 PARAMETERS

=head2 dry_it (CODE)

This method export to UNIVERSAL one parameter called dry_it, and it works with MooseX::Role::DryRunnable

=head1 SEE ALSO

L<Moose::Role>, L<Attribute::Handlers>, L<MooseX::Role::DryRunnable>.

=head1 BUGS AND LIMITATIONS

There are no known bugs in this module.

Please report problems to Tiago Peczenyj <tiago.peczenyj@gmail.com>, or (preferred)
to this package's RT tracker at <bug-MooseX-Role-DryRunnable@rt.cpan.org>.

=head1 AUTHOR

Tiago Peczenyj <tiago.peczenyj@gmail.com>