Code.ensure_loaded? will load the module if one os available. However I
would strongly suggest to stop guessing and keep atoms and modules apart,
maybe by passing a tuple. Otherwise, what if you want to pass an atom and
it happens to have the same name as an Erlang module?

On Thursday, July 21, 2016, OvermindDL1 <overmind...@gmail.com> wrote:

> Confirmed it is what I thought it was:
> ```elixir
> iex(16)> :erlang.function_exported(:observer, :module_info, 0)
> false
> iex(17)> :observer.start
> :ok
> iex(18)> :erlang.function_exported(:observer, :module_info, 0)
> true
> ```
>
> On Thursday, July 21, 2016 at 12:41:18 PM UTC-6, OvermindDL1 wrote:
>>
>> Oh, and I might know why, the module might not be loaded yet.  Until code
>> is actually called in the module then it is not loaded into the VM, but
>> once loaded it stays loaded, I actually have something that manages that in
>> my Plugin system that handles dynamic Module detection and loading:
>> ```elixir
>> iex(14)> ExPlugins.get_plugins(MyServer.PermsBehaviour)
>> [MyServer.Perms.Auth.Permission, MyServer.Perms.Auth.Profile,
>>  MyServer.Perms.Auth.Users, MyServer.Perms.Auth,
>> MyServer.Perms.Help.Issue,
>>  MyServer.Perms.Help, MyServer.Perms.Messenger,
>>  MyServer.Perms.SomeOtherSection.Report,
>> MyServer.Perms.SomeOtherSection.Requirement,
>>  MyServer.Perms.SomeOtherSection.Semester,
>> MyServer.Perms.SomeOtherSection.Student.Requirement,
>>  MyServer.Perms.SomeOtherSection.Student.Semester,
>> MyServer.Perms.SomeOtherSection.Student,
>>  MyServer.Perms.SomeOtherSection, MyServer.Perms.Tag]
>> ```
>> It is my Elixir port of my old Erlang plugin system (so much easier to
>> write here).  It detects what module implement a behaviour, verify they are
>> loaded into the system, if not it loads them, then returns a list of them
>> (while caching the results for faster response later along with being able
>> to purge the cache via `ExPlugin.clear_cache(MyServer.PermsBehaviour)` or
>> just `ExPlugin.clear_cache()` to clear everything.  But yes, I had to load
>> the modules properly to detect their information.
>>
>> On Thursday, July 21, 2016 at 12:32:43 PM UTC-6, OvermindDL1 wrote:
>>>
>>> Nope, something is borked for you:
>>> ```elixir
>>> iex(12)> :erlang.function_exported(GenEvent.Stream, :module_info, 0)
>>> true
>>> ```
>>>
>>> On Thursday, July 21, 2016 at 12:28:28 PM UTC-6, Theron Boerner wrote:
>>>>
>>>> True, OvermindDL1's is the way to go unless you need info about the
>>>> module. Anyone know why this doesn't work?:
>>>>
>>>> iex(11)> :erlang.function_exported(GenEvent.Stream, :module_info, 0)
>>>> false
>>>>
>>>> or
>>>>
>>>> iex(1)> :erlang.get_module_info(GenEvent.Stream, :module)
>>>> ** (ArgumentError) argument error
>>>>     :erlang.get_module_info(GenEvent.Stream, :module)
>>>>
>>>> Could it be because it defined a struct?
>>>>
>>>> On Thu, Jul 21, 2016 at 1:20 PM OvermindDL1 <overm...@gmail.com> wrote:
>>>>
>>>>> That requires dealing with an error and having a try/catch and it is
>>>>> just a pain.  As I mentioned before, testing if the function
>>>>> `module_info/0` exists I think is a great way:
>>>>> ```elixir
>>>>> iex(9)> :erlang.function_exported(:blah, :module_info, 0)
>>>>> false
>>>>> iex(10)> :erlang.function_exported(String, :module_info, 0)
>>>>> true
>>>>> ```
>>>>>
>>>>>
>>>>> On Thursday, July 21, 2016 at 12:14:30 PM UTC-6, Theron Boerner wrote:
>>>>>>
>>>>>> Use this:
>>>>>>
>>>>>> iex(7)> :erlang.get_module_info(String, :module)
>>>>>> String
>>>>>> iex(8)> :erlang.get_module_info(:lists, :module)
>>>>>> :lists
>>>>>> iex(9)> :erlang.get_module_info(:walrus, :module)
>>>>>> ** (ArgumentError) argument error
>>>>>>     :erlang.get_module_info(:walrus, :module)
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thursday, July 21, 2016 at 12:20:46 PM UTC-5, ...Paul wrote:
>>>>>>>
>>>>>>> Not saying this is a great idea, but I'm working with a pattern
>>>>>>> where a parameter can be a module or a string.  The gist is:
>>>>>>>
>>>>>>> def do_it(data, foo) when is_bitstring(foo), do: data
>>>>>>> def do_it(data, foo) do
>>>>>>>   foo.do_other_thing(data)
>>>>>>> end
>>>>>>>
>>>>>>> Works great, but what if I want to allow actual atoms to be used,
>>>>>>> similar to strings?  How can I identify the difference between an actual
>>>>>>> atom, like :bar, and a module, like Bar?
>>>>>>>
>>>>>>> is_atom() returns true for both cases (makes sense because module
>>>>>>> names are basically atoms, :"Elixir.Bar")  Is there a way to tell the
>>>>>>> difference with a guard?
>>>>>>>
>>>>>>> If not a guard, some Kernel or Module function?
>>>>>>>
>>>>>>> ...Paul
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "elixir-lang-talk" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to elixir-lang-ta...@googlegroups.com.
>>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/elixir-lang-talk/9fed8269-f58f-4d65-b369-ea6477b2126a%40googlegroups.com
>>>>> <https://groups.google.com/d/msgid/elixir-lang-talk/9fed8269-f58f-4d65-b369-ea6477b2126a%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to elixir-lang-talk+unsubscr...@googlegroups.com
> <javascript:_e(%7B%7D,'cvml','elixir-lang-talk%2bunsubscr...@googlegroups.com');>
> .
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-talk/ea35fb1e-a2b6-4029-9425-ea71d265ee24%40googlegroups.com
> <https://groups.google.com/d/msgid/elixir-lang-talk/ea35fb1e-a2b6-4029-9425-ea71d265ee24%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>


-- 


*José Valim*
www.plataformatec.com.br
Skype: jv.ptec
Founder and Director of R&D

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-talk+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-talk/CAGnRm4%2BHi6LO%2BvCgZv8qEy%3D92j_r-Q7_7vTvWYeYPt0%3DXjSYfA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to