1 <?xml version="1.0" encoding="iso-8859-1"?>
3 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
8 <title>Module: MCollective::PluginManager</title>
9 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10 <meta http-equiv="Content-Script-Type" content="text/javascript" />
11 <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12 <script type="text/javascript">
15 function popupCode( url ) {
16 window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
19 function toggleCode( id ) {
20 if ( document.getElementById )
21 elem = document.getElementById( id );
22 else if ( document.all )
23 elem = eval( "document.all." + id );
27 elemStyle = elem.style;
29 if ( elemStyle.display != "block" ) {
30 elemStyle.display = "block"
32 elemStyle.display = "none"
38 // Make codeblocks hidden by default
39 document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
49 <div id="classHeader">
50 <table class="header-table">
51 <tr class="top-aligned-row">
52 <td><strong>Module</strong></td>
53 <td class="class-name-in-header">MCollective::PluginManager</td>
55 <tr class="top-aligned-row">
56 <td><strong>In:</strong></td>
58 <a href="../../files/lib/mcollective/pluginmanager_rb.html">
59 lib/mcollective/pluginmanager.rb
67 <!-- banner header -->
69 <div id="bodyContent">
73 <div id="contextContent">
75 <div id="description">
77 A simple plugin manager, it stores one plugin each of a specific type the
78 idea is that we can only have one security provider, one connector etc.
86 <div id="method-list">
87 <h3 class="section-bar">Methods</h3>
89 <div class="name-list">
90 <a href="#M000025"><<</a>
91 <a href="#M000030">[]</a>
92 <a href="#M000029">clear</a>
93 <a href="#M000031">create_instance</a>
94 <a href="#M000026">delete</a>
95 <a href="#M000032">find</a>
96 <a href="#M000033">find_and_load</a>
97 <a href="#M000035">grep</a>
98 <a href="#M000027">include?</a>
99 <a href="#M000034">loadclass</a>
100 <a href="#M000028">pluginlist</a>
118 <!-- if method_list -->
120 <h3 class="section-bar">Public Class methods</h3>
122 <div id="method-M000025" class="method-detail">
123 <a name="M000025"></a>
125 <div class="method-heading">
126 <a href="#M000025" class="method-signature">
127 <span class="method-name"><<</span><span class="method-args">(plugin)</span>
131 <div class="method-description">
133 Adds a plugin to the list of plugins, we expect a hash like:
136 {:type => "base",
137 :class => foo.new}
143 {:type => "base",
144 :class => "Foo::Bar"}
147 In the event that we already have a class with the given type an exception
151 If the :class passed is a <a href="../String.html">String</a> then we will
152 delay instantiation till the first time someone asks for the plugin, this
153 is because most likely the registration gets done by inherited() hooks, at
154 which point the plugin class is not final.
157 If we were to do a .new here the Class initialize method would get called
158 and not the plugins, we there for only initialize the classes when they get
162 By default all plugin instances are cached and returned later so
163 there‘s always a single instance. You can pass :single_instance =>
164 false when calling this to instruct it to always return a new instance when
165 a copy is requested. This only works with sending a <a
166 href="../String.html">String</a> for :class.
168 <p><a class="source-toggle" href="#"
169 onclick="toggleCode('M000025-source');return false;">[Source]</a></p>
170 <div class="method-source-code" id="M000025-source">
172 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 30</span>
173 30: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-operator"><<</span>(<span class="ruby-identifier">plugin</span>)
174 31: <span class="ruby-identifier">plugin</span>[<span class="ruby-identifier">:single_instance</span>] = <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">plugin</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">:single_instance</span>)
176 33: <span class="ruby-identifier">type</span> = <span class="ruby-identifier">plugin</span>[<span class="ruby-identifier">:type</span>]
177 34: <span class="ruby-identifier">klass</span> = <span class="ruby-identifier">plugin</span>[<span class="ruby-identifier">:class</span>]
178 35: <span class="ruby-identifier">single</span> = <span class="ruby-identifier">plugin</span>[<span class="ruby-identifier">:single_instance</span>]
180 37: <span class="ruby-identifier">raise</span>(<span class="ruby-node">"Plugin #{type} already loaded"</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">type</span>)
183 40: <span class="ruby-comment cmt"># If we get a string then store 'nil' as the instance, signalling that we'll</span>
184 41: <span class="ruby-comment cmt"># create the class later on demand.</span>
185 42: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">String</span>)
186 43: <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">type</span>] = {<span class="ruby-identifier">:loadtime</span> =<span class="ruby-operator">></span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>, <span class="ruby-identifier">:class</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">klass</span>, <span class="ruby-identifier">:instance</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">:single</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">single</span>}
187 44: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Registering plugin #{type} with class #{klass} single_instance: #{single}"</span>)
188 45: <span class="ruby-keyword kw">else</span>
189 46: <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">type</span>] = {<span class="ruby-identifier">:loadtime</span> =<span class="ruby-operator">></span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>, <span class="ruby-identifier">:class</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">class</span>, <span class="ruby-identifier">:instance</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">klass</span>, <span class="ruby-identifier">:single</span> =<span class="ruby-operator">></span> <span class="ruby-keyword kw">true</span>}
190 47: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Registering plugin #{type} with class #{klass.class} single_instance: true"</span>)
191 48: <span class="ruby-keyword kw">end</span>
192 49: <span class="ruby-keyword kw">end</span>
198 <div id="method-M000030" class="method-detail">
199 <a name="M000030"></a>
201 <div class="method-heading">
202 <a href="#M000030" class="method-signature">
203 <span class="method-name">[]</span><span class="method-args">(plugin)</span>
207 <div class="method-description">
209 Gets a plugin by type
211 <p><a class="source-toggle" href="#"
212 onclick="toggleCode('M000030-source');return false;">[Source]</a></p>
213 <div class="method-source-code" id="M000030-source">
215 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 72</span>
216 72: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-operator">[]</span>(<span class="ruby-identifier">plugin</span>)
217 73: <span class="ruby-identifier">raise</span>(<span class="ruby-node">"No plugin #{plugin} defined"</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">plugin</span>)
219 75: <span class="ruby-identifier">klass</span> = <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:class</span>]
221 77: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:single</span>]
222 78: <span class="ruby-comment cmt"># Create an instance of the class if one hasn't been done before</span>
223 79: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:instance</span>] <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>
224 80: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Returning new plugin #{plugin} with class #{klass}"</span>)
225 81: <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:instance</span>] = <span class="ruby-identifier">create_instance</span>(<span class="ruby-identifier">klass</span>)
226 82: <span class="ruby-keyword kw">else</span>
227 83: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Returning cached plugin #{plugin} with class #{klass}"</span>)
228 84: <span class="ruby-keyword kw">end</span>
230 86: <span class="ruby-ivar">@plugins</span>[<span class="ruby-identifier">plugin</span>][<span class="ruby-identifier">:instance</span>]
231 87: <span class="ruby-keyword kw">else</span>
232 88: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Returning new plugin #{plugin} with class #{klass}"</span>)
233 89: <span class="ruby-identifier">create_instance</span>(<span class="ruby-identifier">klass</span>)
234 90: <span class="ruby-keyword kw">end</span>
235 91: <span class="ruby-keyword kw">end</span>
241 <div id="method-M000029" class="method-detail">
242 <a name="M000029"></a>
244 <div class="method-heading">
245 <a href="#M000029" class="method-signature">
246 <span class="method-name">clear</span><span class="method-args">()</span>
250 <div class="method-description">
252 deletes all registered plugins
254 <p><a class="source-toggle" href="#"
255 onclick="toggleCode('M000029-source');return false;">[Source]</a></p>
256 <div class="method-source-code" id="M000029-source">
258 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 67</span>
259 67: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">clear</span>
260 68: <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">clear</span>
261 69: <span class="ruby-keyword kw">end</span>
267 <div id="method-M000031" class="method-detail">
268 <a name="M000031"></a>
270 <div class="method-heading">
271 <a href="#M000031" class="method-signature">
272 <span class="method-name">create_instance</span><span class="method-args">(klass)</span>
276 <div class="method-description">
278 use eval to create an instance of a class
280 <p><a class="source-toggle" href="#"
281 onclick="toggleCode('M000031-source');return false;">[Source]</a></p>
282 <div class="method-source-code" id="M000031-source">
284 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 94</span>
285 94: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">create_instance</span>(<span class="ruby-identifier">klass</span>)
286 95: <span class="ruby-keyword kw">begin</span>
287 96: <span class="ruby-identifier">eval</span>(<span class="ruby-node">"#{klass}.new"</span>)
288 97: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">e</span>
289 98: <span class="ruby-identifier">raise</span>(<span class="ruby-node">"Could not create instance of plugin #{klass}: #{e}"</span>)
290 99: <span class="ruby-keyword kw">end</span>
291 100: <span class="ruby-keyword kw">end</span>
297 <div id="method-M000026" class="method-detail">
298 <a name="M000026"></a>
300 <div class="method-heading">
301 <a href="#M000026" class="method-signature">
302 <span class="method-name">delete</span><span class="method-args">(plugin)</span>
306 <div class="method-description">
308 Removes a plugim the list
310 <p><a class="source-toggle" href="#"
311 onclick="toggleCode('M000026-source');return false;">[Source]</a></p>
312 <div class="method-source-code" id="M000026-source">
314 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 52</span>
315 52: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">plugin</span>)
316 53: <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">plugin</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">plugin</span>)
317 54: <span class="ruby-keyword kw">end</span>
323 <div id="method-M000032" class="method-detail">
324 <a name="M000032"></a>
326 <div class="method-heading">
327 <a href="#M000032" class="method-signature">
328 <span class="method-name">find</span><span class="method-args">(type, extension="rb")</span>
332 <div class="method-description">
334 Finds plugins in all configured libdirs
337 find("agent")
340 will return an array of just agent names, for example:
343 ["puppetd", "package"]
346 Can also be used to <a href="PluginManager.html#M000032">find</a> files of
350 find("agent", "ddl")
353 Will return the same list but only of files with extension .ddl in the
356 <p><a class="source-toggle" href="#"
357 onclick="toggleCode('M000032-source');return false;">[Source]</a></p>
358 <div class="method-source-code" id="M000032-source">
360 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 116</span>
361 116: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">find</span>(<span class="ruby-identifier">type</span>, <span class="ruby-identifier">extension</span>=<span class="ruby-value str">"rb"</span>)
362 117: <span class="ruby-identifier">extension</span> = <span class="ruby-node">".#{extension}"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">extension</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp re">/^\./</span>)
364 119: <span class="ruby-identifier">plugins</span> = []
366 121: <span class="ruby-constant">Config</span>.<span class="ruby-identifier">instance</span>.<span class="ruby-identifier">libdir</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">libdir</span><span class="ruby-operator">|</span>
367 122: <span class="ruby-identifier">plugdir</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>([<span class="ruby-identifier">libdir</span>, <span class="ruby-value str">"mcollective"</span>, <span class="ruby-identifier">type</span>.<span class="ruby-identifier">to_s</span>])
368 123: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-identifier">plugdir</span>)
370 125: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">plugdir</span>).<span class="ruby-identifier">grep</span>(<span class="ruby-node">/#{extension}$/</span>).<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">plugin</span><span class="ruby-operator">|</span>
371 126: <span class="ruby-identifier">plugins</span> <span class="ruby-operator"><<</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">basename</span>(<span class="ruby-identifier">plugin</span>, <span class="ruby-identifier">extension</span>)
372 127: <span class="ruby-keyword kw">end</span>
373 128: <span class="ruby-keyword kw">end</span>
375 130: <span class="ruby-identifier">plugins</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">uniq</span>
376 131: <span class="ruby-keyword kw">end</span>
382 <div id="method-M000033" class="method-detail">
383 <a name="M000033"></a>
385 <div class="method-heading">
386 <a href="#M000033" class="method-signature">
387 <span class="method-name">find_and_load</span><span class="method-args">(type, extension="rb") {|plugin| ...}</span>
391 <div class="method-description">
393 Finds and loads from disk all plugins from all libdirs that match certain
397 find_and_load("pluginpackager")
400 Will <a href="PluginManager.html#M000032">find</a> all .rb files in the
401 libdir/mcollective/pluginpackager/ directory in all libdirs and load them
405 You can influence what plugins get loaded using a block notation:
408 find_and_load("pluginpackager") do |plugin|
409 plugin.match(/puppet/)
413 This will load only plugins matching /puppet/
415 <p><a class="source-toggle" href="#"
416 onclick="toggleCode('M000033-source');return false;">[Source]</a></p>
417 <div class="method-source-code" id="M000033-source">
419 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 148</span>
420 148: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">find_and_load</span>(<span class="ruby-identifier">type</span>, <span class="ruby-identifier">extension</span>=<span class="ruby-value str">"rb"</span>)
421 149: <span class="ruby-identifier">extension</span> = <span class="ruby-node">".#{extension}"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">extension</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp re">/^\./</span>)
423 151: <span class="ruby-identifier">klasses</span> = <span class="ruby-identifier">find</span>(<span class="ruby-identifier">type</span>, <span class="ruby-identifier">extension</span>).<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">plugin</span><span class="ruby-operator">|</span>
424 152: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
425 153: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-keyword kw">yield</span>(<span class="ruby-identifier">plugin</span>)
426 154: <span class="ruby-keyword kw">end</span>
428 156: <span class="ruby-value str">"%s::%s::%s"</span> <span class="ruby-operator">%</span> [ <span class="ruby-value str">"MCollective"</span>, <span class="ruby-identifier">type</span>.<span class="ruby-identifier">capitalize</span>, <span class="ruby-identifier">plugin</span>.<span class="ruby-identifier">capitalize</span> ]
429 157: <span class="ruby-keyword kw">end</span>.<span class="ruby-identifier">compact</span>
431 159: <span class="ruby-identifier">klasses</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">uniq</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">klass</span><span class="ruby-operator">|</span> <span class="ruby-identifier">loadclass</span>(<span class="ruby-identifier">klass</span>, <span class="ruby-keyword kw">true</span>)}
432 160: <span class="ruby-keyword kw">end</span>
438 <div id="method-M000035" class="method-detail">
439 <a name="M000035"></a>
441 <div class="method-heading">
442 <a href="#M000035" class="method-signature">
443 <span class="method-name">grep</span><span class="method-args">(regex)</span>
447 <div class="method-description">
449 Grep‘s over the plugin list and returns the list found
451 <p><a class="source-toggle" href="#"
452 onclick="toggleCode('M000035-source');return false;">[Source]</a></p>
453 <div class="method-source-code" id="M000035-source">
455 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 176</span>
456 176: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">grep</span>(<span class="ruby-identifier">regex</span>)
457 177: <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">grep</span>(<span class="ruby-identifier">regex</span>)
458 178: <span class="ruby-keyword kw">end</span>
464 <div id="method-M000027" class="method-detail">
465 <a name="M000027"></a>
467 <div class="method-heading">
468 <a href="#M000027" class="method-signature">
469 <span class="method-name">include?</span><span class="method-args">(plugin)</span>
473 <div class="method-description">
475 Finds out if we have a plugin with the given name
477 <p><a class="source-toggle" href="#"
478 onclick="toggleCode('M000027-source');return false;">[Source]</a></p>
479 <div class="method-source-code" id="M000027-source">
481 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 57</span>
482 57: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">plugin</span>)
483 58: <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">plugin</span>)
484 59: <span class="ruby-keyword kw">end</span>
490 <div id="method-M000034" class="method-detail">
491 <a name="M000034"></a>
493 <div class="method-heading">
494 <a href="#M000034" class="method-signature">
495 <span class="method-name">loadclass</span><span class="method-args">(klass, squash_failures=false)</span>
499 <div class="method-description">
501 Loads a class from file by doing some simple search/replace on class names
502 and then doing a require.
504 <p><a class="source-toggle" href="#"
505 onclick="toggleCode('M000034-source');return false;">[Source]</a></p>
506 <div class="method-source-code" id="M000034-source">
508 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 164</span>
509 164: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">loadclass</span>(<span class="ruby-identifier">klass</span>, <span class="ruby-identifier">squash_failures</span>=<span class="ruby-keyword kw">false</span>)
510 165: <span class="ruby-identifier">fname</span> = <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-value str">"::"</span>, <span class="ruby-value str">"/"</span>).<span class="ruby-identifier">downcase</span> <span class="ruby-operator">+</span> <span class="ruby-value str">".rb"</span>
512 167: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"Loading #{klass} from #{fname}"</span>)
514 169: <span class="ruby-identifier">load</span> <span class="ruby-identifier">fname</span>
515 170: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">e</span>
516 171: <span class="ruby-constant">Log</span>.<span class="ruby-identifier">error</span>(<span class="ruby-node">"Failed to load #{klass}: #{e}"</span>)
517 172: <span class="ruby-identifier">raise</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">squash_failures</span>
518 173: <span class="ruby-keyword kw">end</span>
524 <div id="method-M000028" class="method-detail">
525 <a name="M000028"></a>
527 <div class="method-heading">
528 <a href="#M000028" class="method-signature">
529 <span class="method-name">pluginlist</span><span class="method-args">()</span>
533 <div class="method-description">
535 Provides a list of plugins we know about
537 <p><a class="source-toggle" href="#"
538 onclick="toggleCode('M000028-source');return false;">[Source]</a></p>
539 <div class="method-source-code" id="M000028-source">
541 <span class="ruby-comment cmt"># File lib/mcollective/pluginmanager.rb, line 62</span>
542 62: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">pluginlist</span>
543 63: <span class="ruby-ivar">@plugins</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>
544 64: <span class="ruby-keyword kw">end</span>
557 <div id="validator-badges">
558 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>