Index: Padre/Makefile.PL
===================================================================
--- Padre/Makefile.PL	(revision 7797)
+++ Padre/Makefile.PL	(working copy)
@@ -43,6 +43,7 @@
 requires       'DBD::SQLite'              => '1.10';
 requires       'DBI'                      => '1.58';
 requires       'Devel::Dumpvar'           => '0.04';
+requires       'Devel::Refactor'          => '0.05';
 requires       'Digest::MD5'              => 0;
 requires       'Encode'                   => '2.26';
 requires       'File::Basename'           => 0;
Index: Padre/lib/Padre/Wx/Menu/Perl.pm
===================================================================
--- Padre/lib/Padre/Wx/Menu/Perl.pm	(revision 7797)
+++ Padre/lib/Padre/Wx/Menu/Perl.pm	(working copy)
@@ -81,6 +81,37 @@
 		},
 	);
 
+	$self->{extract_subroutine} = $self->add_menu_item(
+		$self,
+		name       => 'perl.extract_subroutine',
+		label      => Wx::gettext('Extract Subroutine'),
+		menu_event => sub {
+			my $doc    = $_[0]->current->document;
+			my $editor = $doc->editor;
+			my $code   = $editor->GetSelectedText();
+			require Padre::Wx::History::TextEntryDialog;
+			my $dialog = Padre::Wx::History::TextEntryDialog->new(
+				$_[0],
+				Wx::gettext("New Subroutine Name"),
+				Wx::gettext("Please enter a name for the new subroutine"),
+				'$foo',
+			);
+			return if $dialog->ShowModal == Wx::wxID_CANCEL;
+			my $newname = $dialog->GetValue;
+			$dialog->Destroy;
+			return unless defined $newname;
+
+			require Devel::Refactor;
+			my $refactory = Devel::Refactor->new;
+			my ( $new_sub_call, $new_code ) = $refactory->extract_subroutine( $newname, $code, 1 );
+			$editor->BeginUndoAction(); # do the edit atomically
+			$editor->ReplaceSelection($new_sub_call);
+			$editor->DocumentEnd();     # TODO: find a better place to put the new subroutine
+			$editor->AddText($new_code);
+			$editor->EndUndoAction();
+		},
+	);
+
 	$self->{introduce_temporary} = $self->add_menu_item(
 		$self,
 		name       => 'perl.introduce_temporary',
