# sol2 3.5.0 documentation

## integrating into existing code

### Search the Documentation

# integrating into existing code

If you’re already using lua and you just want to use `sol` in some places, you can use `state_view`:

using state_view

     1int something_in_my_system (lua_State* L) {
     2        // start using sol with a pre-existing system
     3        sol::state_view lua(L); // non-owning
     4
     5        lua.script("print('bark bark bark!')");
     6
     7        // get the table off the top of the stack
     8        sol::table expected_table(L, -1);
     9        // start using it...
    10
    11        return 0; // or whatever you require of working with a raw function
    12}

sol::state_view is exactly like `sol::state`, but it doesn’t manage the lifetime of a `lua_State*`. Therefore, you get all the goodies that come with a `sol::state` without any of the ownership implications. sol has no initialization components that need to deliberately remain alive for the duration of the program. It’s entirely self-containing and uses lua’s garbage collectors and various implementation techniques to require no state C++-side. After you do that, all of the power of sol is available to you, and then some!

`sol::state_view` is also helpful when you want to create a DLL that loads some Lua module via requires.

You may also want to call `require` and supply a string of a script file or something that returns an object that you set equal to something in C++. For that, you can use the require functionality.

Remember that sol can be as lightweight as you want it: almost all of sol’s Lua types take the `lua_State*` argument and then a second `int index` stack index argument, meaning you can use tables, lua functions, coroutines, and other reference-derived objects that expose the proper constructor for your use. You can also set usertypes and other things you need without changing your entire architecture in one go.

You can even customize it to work with an external Lua wrapper/framework/library.

Note that you can also make non-standard pointer and reference types with custom reference counting and such also play nice with the system. See unique_usertype_traits<T> to see how! Custom types is also mentioned in the customization tutorial.

There are a few things that creating a `sol::state` does for you. You can read about it in the sol::state docs and call those functions directly if you need them.