Devel-REPL

 view release on metacpan or  search on metacpan

lib/Devel/REPL/Overview.pod  view on Meta::CPAN


  > print "Hi!\n";

  > } # statement is evaluated only after we've finished typing block.
      # See Plugins section.
  > __PACKAGE__
  MyPackage
  > package main;

  > __PACKAGE_
  main
  > MyPackage->say_hi
  Hi!
  1
  $


=head2 Control files a.k.a. I don't want to type it every time

L<Devel::REPL> has a control files feature. Control files are
evaluated on session start in the same way as you would
type them manually in the console.

The default control file is located at F<$HOME/.re.pl/repl.rc>.

You can store there any statements you would normally type in.

I.e. my F<$HOME/.re.pl/repl.rc> has next lines:

      use feature 'say'; # to don't write \n all the time

      use Data::Dumper;

      # pretty print data structures
      sub pp { print Data::Dumper->Dump([@_]) }

You can have multiple control files and they can be anywhere in the
file system. To make F<re.pl> use some rc-file other than F<repl.rc>,
call it like this:

      $ re.pl --rcfile /path/to/your/rc.file

If your rc-file is in F<$HOME/.re.pl> directory, you can omit the path:

      $ re.pl --rcfile rc.file

If you have rc-file with the same name in current directory
and you don't want to type path, you can:

      $ re.pl --rcfile ./rc.file

=head2 I want it to bark, fly, jump and swim! or Plugins

Plugins extend functionality and change behavior of Devel::REPL.
Bundled plugins are:

=over 2

=item *

L<Devel::REPL::Plugin::History>
  No comments. Simply history.

=item *

L<Devel::REPL::Plugin::!LexEnv>
  Provides a lexical environment for the Devel::REPL.

=item *

L<Devel::REPL::Plugin::DDS>
  Formats return values with Data::Dump::Streamer module.

=item *

L<Devel::REPL::Plugin::Packages>
  Keeps track of which package your're in.

=item *

L<Devel::REPL::Plugin::Commands>
  Generic command creation plugin using injected functions.

=item *

L<Devel::REPL::Plugin::MultiLine::PPI>
  Makes Devel::REPL read your input until your block
  is finished. What does this means: you can type a part of a block
  on one line and second part on another:

       $ sub mysub {

       > print "Hello, World!\n"; ## notice prompt change

       > }

       $ mysub
       Hello, World!
       1
       $

  but this *doesn't* mean you can print sub name or identifier
  on several lines. Don't do that! It won't work.

=back

There are lots of contributed plugins you can find at CPAN.

=head1 Profiles

If plugins change and extend functionality of L<Devel::REPL>, profiles
are changing your environment (loaded plugins, constants, subs and etc.).

For example, the Minimal profile, L<Devel::REPL::Profile::Minimal>:

      package Devel::REPL::Profile::Minimal;

      use Moose; ### advanced OOP system for Perl

      ### keep those exports/imports out of our namespace
      use namespace::autoclean;

      with 'Devel::REPL::Profile';  ## seem perldoc Muse

      sub plugins { ### plugins we want to be loaded
        qw(History LexEnv DDS Packages Commands MultiLine::PPI);
      }

      ### the only required sub for profile,
      ### it is called on profile activation
      sub apply_profile {
        my ($self, $repl) = @_;
        ### $self - no comments, $repl - current instance of Devel::REPL

        $repl->load_plugin($_) for $self->plugins; ### load our plugins
      }

      1;

There is also the L<StandardDevel::REPL::Profile::Standard> profile, which contains a number of optional (yet
very useful) features.

To enable some profile use the C<--profile> switch:

      $ re.pl --profile SomeProfile

Alternatively, you can set the environment variable C<DEVEL_REPL_PROFILE> to
C<SomeProfile>, or set the C<profile> key in your C<rcfile> (see
L<Devel::REPL> for more information).

=head1 SEE ALSO

=for :list
* L<Devel::REPL>
* L<Devel::REPL::Plugin>
* L<Devel::REPL::Profile>
* L<Reply>

=cut



( run in 0.759 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )